using System;
using CenterSpace.Free;

namespace Arena {
	
	class GeradorPNJ {
        static public int a = 0;

		public static void swap<T> (ref T primeiro, ref T segundo) {
			T temp;
			temp = primeiro;
			primeiro = segundo;
			segundo = temp;
		}
		
		public static int[] geraNPC (int pontosBase, int limitePontos, int[] atributosDoPC) {
			int[] array = new int [4];
            int pontosRestantes = pontosBase;
			int[,] atributosPCnaOrdem = new int [4,2];
            MersenneTwister aleatorio = new MersenneTwister(DateTime.Now.Millisecond + a);
			
			//ordenacao dos atributos
			for (int i = 0; i < 4; i++) {
				atributosPCnaOrdem [i,0] = atributosDoPC[i];
				atributosPCnaOrdem [i,1] = i;
			}
			
			for(int j = 3; j > 0; j--) {
				for(int i = 0; i < j; i++) {
					if(atributosPCnaOrdem [i+1,0] < atributosPCnaOrdem [i,0]) {
						swap(ref atributosPCnaOrdem [i+1,0], ref atributosPCnaOrdem [i,0]);
						swap(ref atributosPCnaOrdem [i+1,1], ref atributosPCnaOrdem [i,1]);
					}
				}
			}

			//geracao aleatoria
			array [atributosPCnaOrdem [3,1]] = aleatorio.Next(limitePontos) + 1 - aleatorio.Next(( (atributosPCnaOrdem [3,0] >= 10) ? (atributosPCnaOrdem [3,0] - 10) : (atributosPCnaOrdem [3,0] + 10)/2) + 1);
			array [atributosPCnaOrdem [2,1]] = aleatorio.Next(limitePontos) + 1 - aleatorio.Next(( (atributosPCnaOrdem [2,0] >= 10) ? (atributosPCnaOrdem [2,0] - 10) : (atributosPCnaOrdem [2,0] + 10)/2) + 2);
			array [atributosPCnaOrdem [1,1]] = aleatorio.Next(limitePontos) + 1 - aleatorio.Next(( (atributosPCnaOrdem [1,0] >= 10) ? (atributosPCnaOrdem [1,0] - 10) : (atributosPCnaOrdem [1,0] + 10)/2) + 3);
			array [atributosPCnaOrdem [0,1]] = aleatorio.Next(limitePontos) + 1 - aleatorio.Next(( (atributosPCnaOrdem [0,0] >= 10) ? (atributosPCnaOrdem [0,0] - 10) : (atributosPCnaOrdem [0,0] + 10)/2) + 4);
			
			int soma = array [0] + array [1] + array [2] + array [3];
			pontosRestantes -= soma;

			//normalizacao
			for (int i = 0; i < 4; i++) {
				while (array [i] < 1) {
					array [i]++;
					pontosRestantes--;
				}
				while (array [i] > limitePontos) {
					array [i]--;
					pontosRestantes++;
				}
			}

			//validacao
			do {
				if (pontosRestantes < 0)
					for (int i = 0; i < 4; i++) {
						if (array [i] > 1) {
							array [i]--;
							pontosRestantes++;
						}
						if (pontosRestantes == 0)
							break;
					}
				else
					for (int i = 0; i < 4; i++) {
						if (array [i] < limitePontos) {
							array [i]++;
							pontosRestantes--;
						}
						if (pontosRestantes == 0)
							break;
					}
			} while (pontosRestantes != 0);

            a++;
			return array;
		}

	}
	
}